<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
     <script type="text/javascript">
       console.log("========== 参数 ==========");
      function f1(x) {
        return x * x;
      }
      console.log(f1(f2));
      console.log(f1(f3));

      function f2(a,b){

      }
      f2('a','b','c');
      console.log(f2.length);

      console.log("========== 传递方式 ==========");
      //函数参数如果是原始类型的值（数值、字符串、布尔值）
      //传递方式是传值传递（passes by value）
      //这意味着，在函数体内修改参数值，不会影响到函数外部。
      var a = 2;
      function f3(a){
        a = 3;
        return a;
      }
        console.log(f3(a)+'  ' + 3);

      console.log("========== 传递方式、停止传递 ==========");
       var obj = {
       name : 1,
     }
      function f4(o) {
        o.name = 2;
      }
      f4(obj);

      console.log(obj.name);

      console.log("========== 传递方式、停止传递 ==========");

     //注意;如果函数内部修改的，
     //不是参数对象的某个属性，而是替换掉整个参数，这时不会影响到原始值。

     var arr = [1,2,3];
     function f5(b) {
       b = [2,3,4];
     }
     f5(arr);

     console.log(arr);

    console.log("========== 同名参数 ==========");
    //如果有同名的参数，则取最后出现的那个值。

    function f6(a,a) {
      return a;
    }

    console.log(f6(2,3));

    console.log("========== arguments对象 ==========");
    var num = function (a,b,c) {
      console.log(arguments[0]);
      console.log(arguments[1]);
      console.log(arguments[2]);
    }

    num(1,2,3);

    console.log("========== 闭包 ==========");

     function f7() {
       var n = 99;
       function f8(n){
         console.log(n);
       }
       return f8(n);
     }
       f7();



     </script>
  </body>
</html>
